/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.beautycenter.DAO;

import br.com.beautycenter.bean.Cliente;
import br.com.beautycenter.bean.Funcionario;
import br.com.beautycenter.bean.PacoteTratamento;
import br.com.beautycenter.bean.Sessao;
import br.com.beautycenter.hibernateUtil.DaoBase;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

/**
 *
 * @author Magelinha
 */
public class PersisteSessao extends DaoBase<Sessao> { 
    public List<Sessao> retornarSessoes(){
        try {
            return findAll();
        } catch (Exception ex) {
            return new ArrayList<Sessao>();
        }
    }
    
    
    public void salvar(Sessao sessao){
        save(sessao);
    }
    
    public void deletar(Sessao sessao){
        try{
            delete(sessao);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
    public Sessao retornarSessaoPeloID(Sessao sessao){
        return getEntityManager().find(Sessao.class, sessao.getIdSessao());
    }
    
    /**
     * Remove todas as sessões de um determinado pacote de tratamento
     * @param sessao 
     */
    public void removerSessoesPeloPacote(PacoteTratamento pacote){
        Query query = getEntityManager().createQuery("DELETE Sessao s WHERE s.pacoteTratamento.idPacote=:id");
        query.setParameter("id", pacote.getIdPacote());
        
        try{
            query.executeUpdate();
        }catch(PersistenceException ex){
            System.out.println("mensagem de erro: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
    
    /**
     * 
     * @param sessao
     * @return 
     */
    public List<Sessao> retornarSessoesPelaData(Date data){
       Query query = getEntityManager().createQuery("FROM Sessao s WHERE s.dtSessao=:data");
       query.setParameter("data", data);
       
       try{
           return query.getResultList();
       }catch(Exception ex){
           return new ArrayList<Sessao>();
       }
    }
    
    /**
     * Retorna todas as sessões de um cliente em um determinado dia. No parâmetro sessao já vai estar contigo do cliente
     * 
     *
     * @param cliente
     * @param data
     * @return 
     */
    public List<Sessao> retornarSessoesPelaDataCliente(Cliente cliente, Date data){
       Query query = getEntityManager().createQuery("FROM Sessao s WHERE s.dtSessao=:data AND s.pacoteTratamento.cliente.idPessoa=:id");
       query.setParameter("data", data);
       query.setParameter("id", cliente.getIdPessoa());
       
       try{
           return query.getResultList();
       }catch(Exception ex){
           return new ArrayList<Sessao>();
       }
    }
    
    /**
     * Retornar todas as sessões de um determinado periodo por funcionário
     * @param funcionario
     * @param inicio
     * @param fim
     * @return 
     */
    public List<Sessao> retornarSessoesPeloFuncionarioPeriodo(Funcionario funcionario, Date inicio, Date fim){
       Query query = getEntityManager().createQuery("FROM Sessao s WHERE s.dtSessao BETWEEN :inicio AND :fim ORDER BY s.funcionario ASC");
       query.setParameter("inicio", inicio);
       query.setParameter("fim", fim);
       
       try{
           return query.getResultList();
       }catch(Exception ex){
           return new ArrayList<Sessao>();
       }
    }
    
    public List<Sessao> retornarSessoesPeloPeriodoFuncionario(Funcionario funcionario, Date inicio, Date fim){
       Query query = getEntityManager().createQuery("FROM Sessao s WHERE "
               + "s.dtSessao BETWEEN :inicio AND :fim "
               + "AND s.funcionario.idPessoa=:id "
               + "ORDER BY s.dtSessao ASC");
       query.setParameter("inicio", inicio);
       query.setParameter("fim", fim);
       query.setParameter("id", funcionario.getIdPessoa());
       
       try{
           return query.getResultList();
       }catch(Exception ex){
           return new ArrayList<Sessao>();
       }
    }
    
    public List<Sessao> retornarSessoesPeloFuncionarioData(Sessao sessao){
        Query query = getEntityManager().createQuery("FROM Sessao s WHERE s.dtSessao=:data AND s.funcionario.idPessoa=:id");
        query.setParameter("data", sessao.getDtSessao());
        query.setParameter("id", sessao.getFuncionario().getIdPessoa());

        try{
            return query.getResultList();
        }catch(Exception ex){
            return new ArrayList<Sessao>();
        }
    }
    
    public List<Sessao> retornarSessoesPeloHorario(Date horario){
        Query query = getEntityManager().createQuery("FROM Sessao s WHERE s.horario=:horario");
        query.setParameter("horario", horario);
        try{
            return query.getResultList();
        }catch(Exception ex){
            ex.printStackTrace();
            return new ArrayList<Sessao>();
        }
    }
    
    public List<Sessao> retornarSessoesGrupoFuncionarios(){
        Query query = getEntityManager().createQuery("FROM Sessao s GROUP BY s.funcionario");
        
        try{
            return query.getResultList();
        }catch(Exception ex){
            ex.printStackTrace();
            return new ArrayList<Sessao>();
        }
    }
    
    public void atualizar(Sessao sessao){
        try{
            update(sessao);
        }catch (Exception ex){
            System.out.println("update: " + ex.getMessage());
            ex.printStackTrace();
        }    
    }
    
    /**
     * Retorna o somatorio dos pagamentos efetuados nas sessões do periodo passado como parâmetro
     * @param inicio
     * @param fim
     * @return 
     */
    public Double totalPagoPorPeriodo(Date inicio, Date fim){
        Query query = getEntityManager().createQuery("SELECT SUM(s.pagamentoEfetuado) FROM Sessao s WHERE s.dtSessao BETWEEN :inicio AND :fim"
                + " AND s.presenca=:presenca");
        query.setParameter("inicio", inicio);
        query.setParameter("fim", fim);
        query.setParameter("presenca", true);
        
        try{
            return (Double)query.getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }
    
    /**
     * Retorna o total a receber durante um período
     * @param inicio
     * @param fim
     * @return 
     */
    public Double totalAReceberPorPeriodo(Date inicio, Date fim){
        Query query = getEntityManager().createQuery("SELECT SUM(s.valorSessao) FROM Sessao s WHERE s.dtSessao BETWEEN :inicio AND :fim");
        query.setParameter("inicio", inicio);
        query.setParameter("fim", fim);
        
        try{
            return (Double)query.getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }
    
    
}
